package com.xja.wechat.controller;

import com.github.wxpay.sdk.WXPay;
import com.xja.wechat.common.DateUtil;
import com.xja.wechat.common.JsonBean;
import com.xja.wechat.common.PtWxTradeDetail;
import com.xja.wechat.pay.MyWXPayConfig;
import com.xja.wechat.service.OrderService;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.unit.DataUnit;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.UUID;

@RestController
@RequestMapping("pay")
public class WXPayController {
    @Autowired
    private OrderService orderService;

    private static Map<String, String> orderStatus = new HashMap<>();


    @RequestMapping("native")
    public JsonBean nativePay() {
        JsonBean jsonBean = new JsonBean(0, "ok", null);
        WXPay wxPay = new WXPay(new MyWXPayConfig());
        Map<String, String> reqData = new HashMap<>();
        reqData.put("body", "扫码支付测试");//商品描述
        //订单不能写死  唯一的
        String out_trade_no = DateUtil.getSdfTimes() + UUID.randomUUID().toString().substring(0, 3);
        reqData.put("out_trade_no", out_trade_no);//商户订单号
        reqData.put("total_fee", "1");//标价金额  分
        reqData.put("spbill_create_ip", "123.12.12.123");//用户终端IP
        reqData.put("notify_url", "http://0lov29o.hn3.mofasuidao.cn/wx/pay/notifyUrl");//通知地址
        reqData.put("trade_type", "NATIVE");//交易类型
        try {
            Map<String, String> unifiedOrder = wxPay.unifiedOrder(reqData);
            System.out.println(unifiedOrder.toString());
            Map<String, Object> map = new HashMap<>();
            map.put("orderId", out_trade_no);
            map.put(out_trade_no, "0");//未支付
            map.put("code_url", unifiedOrder.get("code_url"));
            jsonBean.setData(map);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return jsonBean;
    }

    @RequestMapping("notifyUrl")
    public String notifyUrl(HttpServletRequest request) {
        try {
            ServletInputStream inputStream = request.getInputStream();
            Document document = new SAXBuilder().build(inputStream);//全部文档
            Element rootElement = document.getRootElement();//返回一个节点
            System.out.println("支付订单id是：" + rootElement.getChildText("out_trade_no"));
            /**
             * 验证当前消息来自于微信支付系统
             * 修改订单的状态为已支付
             */
            //   orderStatus.put(rootElement.getChildText("out_trade_no"),"1");//1  代表支付成功
            orderService.updateOrderStatus(rootElement.getChildText("out_trade_no"), "1");
        } catch (IOException | JDOMException e) {
            e.printStackTrace();
        }
        String returnXML = "<xml> \n" +
                "  <return_code><![CDATA[SUCCESS]]></return_code>\n" +
                "  <return_msg><![CDATA[OK]]></return_msg>\n" +
                "</xml> ";
        return "";
    }

    /**
     * @param orderNo
     * @return
     */
    @RequestMapping("queryOrder")
    public JsonBean checkOrderStatus(String orderNo) {
        WXPay wxPay = new WXPay(new MyWXPayConfig());
        Map<String, String> map = new HashMap<>();
        map.put("out_trade_no ", orderNo);
        try {
            Map<String, String> respMap = wxPay.orderQuery(map);
            System.out.println(respMap.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) throws Exception {

        /**
         * 退款
         */
        WXPay wxPay = new WXPay(new MyWXPayConfig());
        Map<String, String> map = new HashMap<>();
        map.put("bill_date", "20200330");
        map.put("bill_type", "ALL");//文档中不是必填，但是会报错，添加之后便不会报错
        Map<String, String> downloadBill = wxPay.downloadBill(map);

        //得到账单
        // System.out.println(downloadBill.get("data"));
        //切割遍历
        String s = downloadBill.get("data");
        String tradeMsg = s.substring(s.indexOf("`"));
        String tradeInfo = tradeMsg.substring(0, tradeMsg.indexOf("总")).replace("`", "");// 去掉汇总数据，并且去掉'`'
        String[] tradeArray = tradeInfo.split("%");  // 根据%来区分
//        PtWxTradeDetail entity = null;
//
//        entity = new PtWxTradeDetail();
//
//        entity.setId(null); // 自动生成id
//
//        entity.setTransDate(DateUtil.str2Date(tradeDetailArray[0], format));// 交易时间
//
//        entity.setCommonId(tradeDetailArray[1]);// 公众账号ID
//
//        entity.setBusinessNo(tradeDetailArray[2]);// 商户号
//
//        entity.setChildBusinessNo(tradeDetailArray[3]);// 子商户号
//
//        entity.setEquipmentNo(tradeDetailArray[4]);// 设备号
//
//        entity.setWxOrderNo(tradeDetailArray[5]);// 微信订单号
//
//        entity.setBusinessOrderNo(tradeDetailArray[6]);// 商户订单号
//
//        entity.setUserIdentity(tradeDetailArray[7]);// 用户标识
//
//        entity.setTransType(tradeDetailArray[8]);// 交易类型
//
//        entity.setTransStatus(tradeDetailArray[9]);// 交易状态
//
//        entity.setPaymentBank(tradeDetailArray[10]);// 付款银行
//
//        entity.setCurrency(tradeDetailArray[11]);// 货币种类
//
//        entity.setTotalAmount(tradeDetailArray[12]);// 总金额
//
//        entity.setRedEnvelopesAmount(tradeDetailArray[13]);// 企业红包金额
//
//        entity.setWxRefundNo(tradeDetailArray[14]);// 微信退款单号
//
//        entity.setBusinessRefundNo(tradeDetailArray[15]);// 商户退款单号
//
//        entity.setRefundAmount(tradeDetailArray[16]);// 退款金额
//
//        entity.setRedEnvelopesRefundAmount(tradeDetailArray[17]);// 企业红包退款金额
//
//        entity.setRefundType(tradeDetailArray[18]);// 退款类型
//
//        entity.setRefundStatus(tradeDetailArray[19]);// 退款状态
//
//        entity.setBusinessName(tradeDetailArray[20]);// 商品名称
//
//        entity.setBusinessData(tradeDetailArray[21]);// 商户数据包
//
//        entity.setFee(tradeDetailArray[22]);// 手续费
//
//        entity.setRate(tradeDetailArray[23] + "%");// 费率
//
//        entity.setCreateDate(new Date());
//
//        wxTradeDetailDao.insert(entity);
        System.out.println(tradeArray);


//        map.put("out_trade_no","20200329222315144f0b");//商户订单号
//        map.put("out_refund_no","1345465756");//商户退款单号
//        map.put("total_fee","1");//订单金额
//        map.put("refund_fee","1");//退款金额
//        try {
//            Map<String, String> resultMap = wxPay.refund(map);
//            System.out.println(resultMap.toString());
//        } catch (Exception e) {
//            e.printStackTrace();
//        }


//        try {
//            Map<String, String> respMap = wxPay.orderQuery(map);
//            respMap.get("trade_state");
//            /**
//             * 如果后端没有接受到回调我们需要做的就是在页面的下一个流程发起有一个ajax请求，把订单编号传入到后端
//             * 我们去发送一次请求调用微信的查询订单API,查询出订单API状态之后，保证数据库和我们查询出来的是一致的，
//             *
//             * （以微信支付系统查询出来的为准）
//             * 查询数据库根据订单id查询数据库，当前订单是否支付
//             * 如果数据库中未支付，微信支付系统查出已支付，那么修改数据库订单状态
//             */
//            System.out.println(respMap.toString());
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
    }
}
